issue

Jennys findings

Hi Jule,

ich hab heute das Area calculation script genutzt und habe hier eine deutliche Diskrepanz bei der bestimmten Area per FOV festgestellt.

Bei den Chips wurden FOV gewählt, die nahezu voll mit Gewebe sind. Daher sind mir vorallem die Chips mit nur 30 bzw. 40% Gewebeabdeckung aufgefallen. Diese Werte können nicht richtig sein.

JennyResult <- data.frame(
  chip_ID = c("M2183864","M2183872","M2183874","M2183878","M2183880","M2183882","M2183884","M2183890","M2183896"),
  FOV = c(40,43,34,30,40,43,39,43,31),
  perc=c(46.8925,75.9814,32.43235,38.7,43.3725,46.46977,78.48718,57.96977,61.69355),
  Area = c(6.720818,11.732213,3.957772,4.128046,6.136645,7.12264,10.883047,8.95558,6.831417),
  calculatedArea = c(14,15.05,11.9,10.5,14,15.05,13.65,15.05,10.85))

output_dir <- "data_output/BUGS/26240"%>%create_working_directory()

chip_IDs <- JennyResult$chip_ID

Ich hab mir Chip M2183864 einmal genauer angeschaut. Hier sind bei einigen Positionen nur um die 20% angegeben. Z.B. Position 219 und 249. Und beide Positionen sind nahezu voll von Gewebe bedeckt.

Die Chips wurden in Hannover auf dem Zellscanner gemessen. Da scheint noch irgendwo was in dem Script fehlerhaft zu sein.

Auszug Ergebnistabelle

reply

Hey Jenny,

zunächst, die angegeben Infos zu chipIDs-FOV kann ich nicht in den Daten wiederfinden. (“M2183864_40” “M2183872_43” “M2183874_34” “M2183878_30” “M2183880_40” “M2183882_43” “M2183884_39” “M2183890_43” “M2183896_31”, gibt es nicht)

Ich habe mir den chip M2183864_219 und 249 genauer angeschaut und habe dann die Parameter ein wenig variiert und würde ohne attenuation aber mit noise reduction empfehlen.

process_TissueDetectionWorkflow(image_groups, output_dir, sigma = 15, threshold = 1, window = 50, attenuation = 0, noiseReduction = TRUE, plot_image =TRUE, export_result = TRUE, result_ID = “noiseReduction”)

Schau mal ob es damit im Gesamten besser ist.

LG ANhang: SummaryResultTissueArea_noiseReduction.csv

prepare input

create ScanHistory

ScanHistory <- create_ScanHistory_extended(chip_IDs,
                                           output_dir,
                                           result_ID = group_ID)
Registered S3 method overwritten by 'params':
  method            from
  print.knitr_kable     
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
create extended ScanHistory: 39.28 sec elapsed

select valid hdr image groups

image_groups <- create_hdr_image_groups(ScanHistory)

check input

reported chip_ID - positions are not correct

image_groups%>%
  dplyr::filter(
   group_ID %in% paste0(JennyResult$chip_ID,"_",JennyResult$FOV))
Warning in `[<-.data.frame`(`*tmp*`, is_list, value = list(`3` = "<>")) :
  replacement element 1 has 1 row to replace 0 rows
 
chip_ID <- "M2183864"
positions <- c(219,249)
pos <- which(image_groups$group_ID %in% paste0(chip_ID,"_",positions))

apply tissue detection workflow

process_TissueDetectionWorkflow(image_groups,
                                output_dir,
                                sigma = 15,
                                threshold = 1, #35, #
                                window = 50,
                                attenuation = 0, #0.01, #
                                noiseReduction = TRUE,
                                plot_image =TRUE, 
                                export_result = TRUE,
                                result_ID = "noiseReduction")

process parametes

with RJobTissueArea Version 0.0.0.22 the tissue detection algorithm was extended by options for noise reduction and attenuation of tiny bright pixels.

Attenuation of bright pixel spots general yield in a better tissue detection. Noise reduction especially play a role for images containing artefacts and background noise. With the use of noiseReduction a theshold of 1 is recommended.

The threshold defines the greyvalue above which a pixels is assigned to tissue group. A high threshold potentially result a lower tissue area. A very low threshold may affect that background counts as tissue.

standard parameter-settings:

threshold attenuation noiseReduction Advantages
4 0 FALSE
  • without attenuation or noise reduction (best setting in package versions < 0.0.0.22
1 0 TRUE
  • noise reduction
35 0.01 FALSE
  • attenuation
35 0.01 TRUE
  • attenuation and noise reduction
25 0.01 TRUE
  • lower threshold + attenuation and noise reduction

without improvements

  • tissue image (left) and result tissueDetection result (right)
  • no tissue: black, detected tissue: white

results_M2183864_219:

results_M2183864_249: tissue image (left) and result tissueDetection (right)

with attenuation

results_M2183864_219: tissue image (left) and result tissueDetection (right)

results_M2183864_249: tissue image (left) and result tissueDetection (right)

noise reduction

results_M2183864_219: tissue image (left) and result tissueDetection (right)

results_M2183864_249: tissue image (left) and result tissueDetection (right)

with attenuation and noise reduction

results_M2183864_219: tissue image (left) and result tissueDetection (right)

results_M2183864_249: tissue image (left) and result tissueDetection (right)

LS0tCnRpdGxlOiAiQlVHRklYIFJFUE9SVCAtIDI2MjQwIgphdXRob3I6ICJZb3VyIE5hbWUiCmRhdGU6ICdgciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVCICVkLCAlWSIpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBoYWRkb2NrCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njb2xsOiB5ZXMKYWJzdHJhY3Q6ICdUaGUgYWltIG9mIHRoaXMgJwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBldmFsID0gVFJVRSkKCmxpYnJhcnkoUkpvYlRpc3N1ZUFyZWEpCmBgYAoKIyBpc3N1ZQoKKipKZW5ueXMgZmluZGluZ3MqKgoKSGkgSnVsZSwKCmljaCBoYWIgaGV1dGUgZGFzIEFyZWEgY2FsY3VsYXRpb24gc2NyaXB0IGdlbnV0enQgdW5kIGhhYmUgaGllciBlaW5lIGRldXRsaWNoZSBEaXNrcmVwYW56IGJlaSBkZXIgYmVzdGltbXRlbiBBcmVhIHBlciBGT1YgZmVzdGdlc3RlbGx0LgoKQmVpIGRlbiBDaGlwcyB3dXJkZW4gRk9WIGdld8OkaGx0LCBkaWUgbmFoZXp1IHZvbGwgbWl0IEdld2ViZSBzaW5kLiAgRGFoZXIgc2luZCBtaXIgdm9yYWxsZW0gZGllIENoaXBzIG1pdCBudXIgMzAgYnp3LiA0MCUgR2V3ZWJlYWJkZWNrdW5nIGF1ZmdlZmFsbGVuLiBEaWVzZSBXZXJ0ZSBrw7ZubmVuIG5pY2h0IHJpY2h0aWcgc2Vpbi4KCmBgYHtyfQpKZW5ueVJlc3VsdCA8LSBkYXRhLmZyYW1lKAogIGNoaXBfSUQgPSBjKCJNMjE4Mzg2NCIsIk0yMTgzODcyIiwiTTIxODM4NzQiLCJNMjE4Mzg3OCIsIk0yMTgzODgwIiwiTTIxODM4ODIiLCJNMjE4Mzg4NCIsIk0yMTgzODkwIiwiTTIxODM4OTYiKSwKICBGT1YgPSBjKDQwLDQzLDM0LDMwLDQwLDQzLDM5LDQzLDMxKSwKICBwZXJjPWMoNDYuODkyNSw3NS45ODE0LDMyLjQzMjM1LDM4LjcsNDMuMzcyNSw0Ni40Njk3Nyw3OC40ODcxOCw1Ny45Njk3Nyw2MS42OTM1NSksCiAgQXJlYSA9IGMoNi43MjA4MTgsMTEuNzMyMjEzLDMuOTU3NzcyLDQuMTI4MDQ2LDYuMTM2NjQ1LDcuMTIyNjQsMTAuODgzMDQ3LDguOTU1NTgsNi44MzE0MTcpLAogIGNhbGN1bGF0ZWRBcmVhID0gYygxNCwxNS4wNSwxMS45LDEwLjUsMTQsMTUuMDUsMTMuNjUsMTUuMDUsMTAuODUpKQoKb3V0cHV0X2RpciA8LSAiZGF0YV9vdXRwdXQvQlVHUy8yNjI0MCIlPiVjcmVhdGVfd29ya2luZ19kaXJlY3RvcnkoKQoKY2hpcF9JRHMgPC0gSmVubnlSZXN1bHQkY2hpcF9JRApgYGAKCkljaCBoYWIgbWlyIENoaXAgTTIxODM4NjQgZWlubWFsIGdlbmF1ZXIgYW5nZXNjaGF1dC4gSGllciBzaW5kIGJlaSBlaW5pZ2VuIFBvc2l0aW9uZW4gbnVyIHVtIGRpZSAyMCUgYW5nZWdlYmVuLiBaLkIuIFBvc2l0aW9uIDIxOSB1bmQgMjQ5LiBVbmQgYmVpZGUgUG9zaXRpb25lbiBzaW5kIG5haGV6dSB2b2xsIHZvbiBHZXdlYmUgYmVkZWNrdC4gCgpEaWUgQ2hpcHMgd3VyZGVuIGluIEhhbm5vdmVyIGF1ZiBkZW0gWmVsbHNjYW5uZXIgZ2VtZXNzZW4uIERhIHNjaGVpbnQgbm9jaCBpcmdlbmR3byB3YXMgaW4gZGVtIFNjcmlwdCBmZWhsZXJoYWZ0IHp1IHNlaW4uCgohW0F1c3p1ZyBFcmdlYm5pc3RhYmVsbGVdKGltYWdlLnBuZykKCiMgcmVwbHkKCgpIZXkgSmVubnksCgp6dW7DpGNoc3QsIGRpZSBhbmdlZ2ViZW4gSW5mb3MgenUgY2hpcElEcy1GT1Yga2FubiBpY2ggbmljaHQgaW4gZGVuIERhdGVuIHdpZWRlcmZpbmRlbi4gKCJNMjE4Mzg2NF80MCIgIk0yMTgzODcyXzQzIiAiTTIxODM4NzRfMzQiICJNMjE4Mzg3OF8zMCIgIk0yMTgzODgwXzQwIiAiTTIxODM4ODJfNDMiICJNMjE4Mzg4NF8zOSIgIk0yMTgzODkwXzQzIiAiTTIxODM4OTZfMzEiLCBnaWJ0IGVzIG5pY2h0KQoKSWNoIGhhYmUgbWlyIGRlbiBjaGlwIE0yMTgzODY0XzIxOSB1bmQgMjQ5IGdlbmF1ZXIgYW5nZXNjaGF1dCB1bmQgaGFiZSBkYW5uIGRpZSBQYXJhbWV0ZXIgZWluIHdlbmlnIHZhcmlpZXJ0IHVuZCB3w7xyZGUgb2huZSBhdHRlbnVhdGlvbiBhYmVyIG1pdCBub2lzZSByZWR1Y3Rpb24gZW1wZmVobGVuLgoKcHJvY2Vzc19UaXNzdWVEZXRlY3Rpb25Xb3JrZmxvdyhpbWFnZV9ncm91cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYSA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ID0gNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW51YXRpb24gPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlUmVkdWN0aW9uID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2ltYWdlID1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydF9yZXN1bHQgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9JRCA9ICJub2lzZVJlZHVjdGlvbiIpCgpTY2hhdSBtYWwgb2IgZXMgZGFtaXQgaW0gR2VzYW10ZW4gYmVzc2VyIGlzdC4KCkxHCkFOaGFuZzogU3VtbWFyeVJlc3VsdFRpc3N1ZUFyZWFfbm9pc2VSZWR1Y3Rpb24uY3N2CgoKIyBwcmVwYXJlIGlucHV0CgoqKmNyZWF0ZSBTY2FuSGlzdG9yeSoqCgpgYGB7cn0KU2Nhbkhpc3RvcnkgPC0gY3JlYXRlX1NjYW5IaXN0b3J5X2V4dGVuZGVkKGNoaXBfSURzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9JRCA9IGdyb3VwX0lEKQpgYGAKCioqc2VsZWN0IHZhbGlkIGhkciBpbWFnZSBncm91cHMqKgoKYGBge3J9CmltYWdlX2dyb3VwcyA8LSBjcmVhdGVfaGRyX2ltYWdlX2dyb3VwcyhTY2FuSGlzdG9yeSkKYGBgCgojIGNoZWNrIGlucHV0IAoKKipyZXBvcnRlZCBjaGlwX0lEIC0gcG9zaXRpb25zIGFyZSBub3QgY29ycmVjdCoqCgpgYGB7cn0KaW1hZ2VfZ3JvdXBzJT4lCiAgZHBseXI6OmZpbHRlcigKICAgZ3JvdXBfSUQgJWluJSBwYXN0ZTAoSmVubnlSZXN1bHQkY2hpcF9JRCwiXyIsSmVubnlSZXN1bHQkRk9WKSkKIApgYGAKCmBgYHtyfQpjaGlwX0lEIDwtICJNMjE4Mzg2NCIKcG9zaXRpb25zIDwtIGMoMjE5LDI0OSkKcG9zIDwtIHdoaWNoKGltYWdlX2dyb3VwcyRncm91cF9JRCAlaW4lIHBhc3RlMChjaGlwX0lELCJfIixwb3NpdGlvbnMpKQpgYGAKCioqYXBwbHkgdGlzc3VlIGRldGVjdGlvbiB3b3JrZmxvdyoqCgpgYGB7cn0KcHJvY2Vzc19UaXNzdWVEZXRlY3Rpb25Xb3JrZmxvdyhpbWFnZV9ncm91cHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYSA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IDEsICMzNSwgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyA9IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVudWF0aW9uID0gMCwgIzAuMDEsICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2lzZVJlZHVjdGlvbiA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9pbWFnZSA9VFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0X3Jlc3VsdCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X0lEID0gIm5vaXNlUmVkdWN0aW9uIikKYGBgCgoKIyBwcm9jZXNzIHBhcmFtZXRlcwoKd2l0aCBSSm9iVGlzc3VlQXJlYSBWZXJzaW9uIDAuMC4wLjIyIHRoZSB0aXNzdWUgZGV0ZWN0aW9uIGFsZ29yaXRobSB3YXMgZXh0ZW5kZWQgYnkgb3B0aW9ucyBmb3Igbm9pc2UgcmVkdWN0aW9uIGFuZCBhdHRlbnVhdGlvbiBvZiB0aW55IGJyaWdodCBwaXhlbHMuCgpBdHRlbnVhdGlvbiBvZiBicmlnaHQgcGl4ZWwgc3BvdHMgZ2VuZXJhbCB5aWVsZCBpbiBhIGJldHRlciB0aXNzdWUgZGV0ZWN0aW9uLiBOb2lzZSByZWR1Y3Rpb24gZXNwZWNpYWxseSBwbGF5IGEgcm9sZSBmb3IgaW1hZ2VzIGNvbnRhaW5pbmcgYXJ0ZWZhY3RzIGFuZCBiYWNrZ3JvdW5kIG5vaXNlLiBXaXRoIHRoZSB1c2Ugb2Ygbm9pc2VSZWR1Y3Rpb24gYSB0aGVzaG9sZCBvZiAxIGlzIHJlY29tbWVuZGVkLgoKVGhlIHRocmVzaG9sZCBkZWZpbmVzIHRoZSBncmV5dmFsdWUgYWJvdmUgd2hpY2ggYSBwaXhlbHMgaXMgYXNzaWduZWQgdG8gdGlzc3VlIGdyb3VwLiBBIGhpZ2ggdGhyZXNob2xkIHBvdGVudGlhbGx5IHJlc3VsdCBhIGxvd2VyIHRpc3N1ZSBhcmVhLiBBIHZlcnkgbG93IHRocmVzaG9sZCBtYXkgYWZmZWN0IHRoYXQgYmFja2dyb3VuZCBjb3VudHMgYXMgdGlzc3VlLiAgCgoqKnN0YW5kYXJkIHBhcmFtZXRlci1zZXR0aW5nczoqKgoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgdGhyZXNob2xkICAgICB8IGF0dGVudWF0aW9uICAgfCBub2lzZVJlZHVjdGlvbnwgQWR2YW50YWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCA0ICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICB8IEZBTFNFICAgICAgICAgfCAtIHdpdGhvdXQgYXR0ZW51YXRpb24gb3Igbm9pc2UgcmVkdWN0aW9uICAgICAgICAgICB8CnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAoYmVzdCBzZXR0aW5nIGluIHBhY2thZ2UgdmVyc2lvbnMgPCAwLjAuMC4yMiAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAxICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICB8IFRSVUUgICAgICAgICAgfCAtIG5vaXNlIHJlZHVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IDM1ICAgICAgICAgICAgfCAwLjAxICAgICAgICAgIHwgRkFMU0UgICAgICAgICB8IC0gYXR0ZW51YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgMzUgICAgICAgICAgICB8IDAuMDEgICAgICAgICAgfCBUUlVFICAgICAgICAgIHwgLSBhdHRlbnVhdGlvbiBhbmQgbm9pc2UgcmVkdWN0aW9uICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAyNSAgICAgICAgICAgIHwgMC4wMSAgICAgICAgICB8IFRSVUUgICAgICAgICAgfCAtIGxvd2VyIHRocmVzaG9sZCArIGF0dGVudWF0aW9uIGFuZCBub2lzZSByZWR1Y3Rpb258CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKIyMgd2l0aG91dCBpbXByb3ZlbWVudHMKCi0gdGlzc3VlIGltYWdlIChsZWZ0KSBhbmQgcmVzdWx0IHRpc3N1ZURldGVjdGlvbiByZXN1bHQgKHJpZ2h0KQotIG5vIHRpc3N1ZTogYmxhY2ssIGRldGVjdGVkIHRpc3N1ZTogd2hpdGUKCiAKIVtyZXN1bHRzX00yMTgzODY0XzIxOTogXShDOi9Vc2Vycy9vcnRtYW5uL0RvY3VtZW50cy9HaXRIdWIvUkpvYlRpc3N1ZUFyZWEvZGF0YV9vdXRwdXQvQlVHUy8yNjI0MC9pbWFnZV9wcm9jZXNzaW5nL3Jlc3VsdF9wbG90cy8xNV80XzUwXzBfRkFMU0UvUmVzdWx0SW1hZ2VzX19NMjE4Mzg2NF8yMTlfUDE3NjE0NTEucG5nKQoKIVtyZXN1bHRzX00yMTgzODY0XzI0OTogdGlzc3VlIGltYWdlIChsZWZ0KSBhbmQgcmVzdWx0IHRpc3N1ZURldGVjdGlvbiAocmlnaHQpXShDOi9Vc2Vycy9vcnRtYW5uL0RvY3VtZW50cy9HaXRIdWIvUkpvYlRpc3N1ZUFyZWEvZGF0YV9vdXRwdXQvQlVHUy8yNjI0MC9pbWFnZV9wcm9jZXNzaW5nL3Jlc3VsdF9wbG90cy8xNV80XzUwXzBfRkFMU0UvUmVzdWx0SW1hZ2VzX19NMjE4Mzg2NF8yNDlfUDE3NjE0NTEucG5nKQoKIyMgd2l0aCBhdHRlbnVhdGlvbgoKIVtyZXN1bHRzX00yMTgzODY0XzIxOTogdGlzc3VlIGltYWdlIChsZWZ0KSBhbmQgcmVzdWx0IHRpc3N1ZURldGVjdGlvbiAocmlnaHQpXShDOi9Vc2Vycy9vcnRtYW5uL0RvY3VtZW50cy9HaXRIdWIvUkpvYlRpc3N1ZUFyZWEvZGF0YV9vdXRwdXQvQlVHUy8yNjI0MC9pbWFnZV9wcm9jZXNzaW5nL3Jlc3VsdF9wbG90cy8xNV8wXzUwXzAuMDFfRkFMU0UvUmVzdWx0SW1hZ2VzX19NMjE4Mzg2NF8yMTlfUDE3NjE0NTEucG5nKQoKIVtyZXN1bHRzX00yMTgzODY0XzI0OTogdGlzc3VlIGltYWdlIChsZWZ0KSBhbmQgcmVzdWx0IHRpc3N1ZURldGVjdGlvbiAocmlnaHQpXShDOi9Vc2Vycy9vcnRtYW5uL0RvY3VtZW50cy9HaXRIdWIvUkpvYlRpc3N1ZUFyZWEvZGF0YV9vdXRwdXQvQlVHUy8yNjI0MC9pbWFnZV9wcm9jZXNzaW5nL3Jlc3VsdF9wbG90cy8xNV8wXzUwXzAuMDFfRkFMU0UvUmVzdWx0SW1hZ2VzX19NMjE4Mzg2NF8yNDlfUDE3NjE0NTEucG5nKQoKIyMgbm9pc2UgcmVkdWN0aW9uCgohW3Jlc3VsdHNfTTIxODM4NjRfMjE5OiB0aXNzdWUgaW1hZ2UgKGxlZnQpIGFuZCByZXN1bHQgdGlzc3VlRGV0ZWN0aW9uIChyaWdodCldKEM6L1VzZXJzL29ydG1hbm4vRG9jdW1lbnRzL0dpdEh1Yi9SSm9iVGlzc3VlQXJlYS9kYXRhX291dHB1dC9CVUdTLzI2MjQwL2ltYWdlX3Byb2Nlc3NpbmcvcmVzdWx0X3Bsb3RzLzE1XzFfNTBfMF9UUlVFL1Jlc3VsdEltYWdlc19fTTIxODM4NjRfMjE5X1AxNzYxNDUxLnBuZykKCiFbcmVzdWx0c19NMjE4Mzg2NF8yNDk6IHRpc3N1ZSBpbWFnZSAobGVmdCkgYW5kIHJlc3VsdCB0aXNzdWVEZXRlY3Rpb24gKHJpZ2h0KV0oQzovVXNlcnMvb3J0bWFubi9Eb2N1bWVudHMvR2l0SHViL1JKb2JUaXNzdWVBcmVhL2RhdGFfb3V0cHV0L0JVR1MvMjYyNDAvaW1hZ2VfcHJvY2Vzc2luZy9yZXN1bHRfcGxvdHMvMTVfMV81MF8wX1RSVUUvUmVzdWx0SW1hZ2VzX19NMjE4Mzg2NF8yNDlfUDE3NjE0NTEucG5nKQoKCiMjIHdpdGggYXR0ZW51YXRpb24gYW5kIG5vaXNlIHJlZHVjdGlvbgoKCiFbcmVzdWx0c19NMjE4Mzg2NF8yMTk6IHRpc3N1ZSBpbWFnZSAobGVmdCkgYW5kIHJlc3VsdCB0aXNzdWVEZXRlY3Rpb24gKHJpZ2h0KV0oQzovVXNlcnMvb3J0bWFubi9Eb2N1bWVudHMvR2l0SHViL1JKb2JUaXNzdWVBcmVhL2RhdGFfb3V0cHV0L0JVR1MvMjYyNDAvaW1hZ2VfcHJvY2Vzc2luZy9yZXN1bHRfcGxvdHMvMTVfMzVfNTBfMC4wMV9UUlVFL1Jlc3VsdEltYWdlc19fTTIxODM4NjRfMjE5X1AxNzYxNDUxLnBuZykKCiFbcmVzdWx0c19NMjE4Mzg2NF8yNDk6IHRpc3N1ZSBpbWFnZSAobGVmdCkgYW5kIHJlc3VsdCB0aXNzdWVEZXRlY3Rpb24gKHJpZ2h0KV0oQzovVXNlcnMvb3J0bWFubi9Eb2N1bWVudHMvR2l0SHViL1JKb2JUaXNzdWVBcmVhL2RhdGFfb3V0cHV0L0JVR1MvMjYyNDAvaW1hZ2VfcHJvY2Vzc2luZy9yZXN1bHRfcGxvdHMvMTVfMzVfNTBfMC4wMV9UUlVFL1Jlc3VsdEltYWdlc19fTTIxODM4NjRfMjQ5X1AxNzYxNDUxLnBuZykK